(local-fun-fn fname)
(get fname 'cmp-inline)
(member (symbol-package fname)
- (load-time-value (mapcar #'symbol-package (list 'c-t-tt (mdlsym "sin") (mdlsym "memmove"))))))))
+ (load-time-value
+ (remove-duplicates
+ (mapcar #'symbol-package
+ (list 'c-t-tt
+ (mdlsym "fabs");FOXME dladdr macos unreliable, need core mdl in raw images
+ (mdlsym "sin") (mdlsym "memmove")))))))))
;; (defun inline-asserted (fname)
;; (unless *compiler-push-events*
-"Version_2_7_2pre26"
+"Version_2_7_2pre27"
#undef HAVE_AOUT
#undef HAVE_ELF
-
-/* Alternatively, we could use the global variable vm_page_size. */
-#define PAGEWIDTH 12
-
-
#include <unistd.h> /* to get sbrk defined */
#define GET_FULL_PATH_SELF(a_) \
do { \
-extern int _NSGetExecutablePath (char *, unsigned long *); \
-unsigned long bufsize = 1024; \
-static char buf [1024]; \
-static char fub [1024]; \
-if (_NSGetExecutablePath (buf, &bufsize) != 0) { \
+ uint32_t bufsize = 1024; \
+ static char buf [1024]; \
+ static char fub [1024]; \
+ if (_NSGetExecutablePath (buf, &bufsize) != 0) { \
error ("_NSGetExecutablePath failed"); \
-} \
-if (realpath (buf, fub) == 0) { \
+ } \
+ if (realpath (buf, fub) == 0) { \
error ("realpath failed"); \
-} \
-(a_) = fub; \
-} while (0)
+ } \
+ (a_) = fub; \
+ } while (0)
#ifdef _LP64
#define C_GC_OFFSET 4
REG_LIST(8,MCF(__fpu_stmm0)),REG_LIST(16,MCF(__fpu_xmm0)));})
-#include <sys/param.h>/*PATH_MAX MAXPATHLEN*/
+#include <sys/param.h>
#undef MIN
#undef MAX
#undef HAVE_AOUT
#undef HAVE_ELF
-
-/* Alternatively, we could use the global variable vm_page_size. */
-/* #define PAGEWIDTH 12 */
-
-
#include <unistd.h> /* to get sbrk defined */
#define GET_FULL_PATH_SELF(a_) \
do { \
-uint32_t bufsize = 1024; \
-static char buf [1024]; \
-static char fub [1024]; \
-if (_NSGetExecutablePath (buf, &bufsize) != 0) { \
+ uint32_t bufsize = 1024; \
+ static char buf [1024]; \
+ static char fub [1024]; \
+ if (_NSGetExecutablePath (buf, &bufsize) != 0) { \
error ("_NSGetExecutablePath failed"); \
-} \
-if (realpath (buf, fub) == 0) { \
+ } \
+ if (realpath (buf, fub) == 0) { \
error ("realpath failed"); \
-} \
-(a_) = fub; \
-} while (0)
+ } \
+ (a_) = fub; \
+ } while (0)
#define C_GC_OFFSET 4
#include <mach-o/arm64/reloc.h>
#define FPE_INIT Cnil
-#include <sys/param.h>/*PATH_MAX MAXPATHLEN*/
+#include <sys/param.h>
#undef MIN
#undef MAX
#define GOT_RELOC(ri) ri->r_type==X86_64_RELOC_GOT_LOAD||ri->r_type==X86_64_RELOC_GOT
-
case X86_64_RELOC_UNSIGNED: // for absolute addresses
if (ri->r_extern || !ri->r_pcrel)
store_val(q,~0L,ri->r_pcrel ? a-rel : a);
break;
+
case X86_64_RELOC_GOT_LOAD: // a MOVQ load of a GOT entry
case X86_64_RELOC_GOT: // a MOVQ load of a GOT entry
a=(ul)got;
case X86_64_RELOC_SIGNED: // for signed 32-bit displacement
+ case X86_64_RELOC_SIGNED_1: // adjustment in *q
+ case X86_64_RELOC_SIGNED_4: // adjustment in *q
case X86_64_RELOC_BRANCH: // a CALL/JMP instruction with 32-bit displacement
if (ri->r_extern || !ri->r_pcrel)
- store_val(q,MASK(32),(ri->r_pcrel ? a-((ul)q+4) : a)+(signed)(*q&MASK(32)));
+ add_vals(q,MASK(32),(ri->r_pcrel ? a-((ul)q+4) : a));
break;
-
void *msbrk(intptr_t);
int msbrk_init(void);
int msbrk_end(void);
-
-object
-quick_call_function_vec(object,ufixnum,object *);
+object quick_call_function_vec(object,ufixnum,object *);
+int msbrk_initialized(void);
(export '(mdlsym mdl lib-name))
-(defun lib-name (p)
- (if (or (string= p "") (string= p "libc") (string= p "libm")) ""
- (string-concatenate #+darwin "/usr/lib/system/" p #+darwin ".dylib" #+cygwin ".dll" #-(or darwin cygwin) ".so")));FIXME
+(defvar *lib-package-syms* nil);FIXME accelerator for do-symbols
+(defvar *dladdr-mods* nil)
+(defconstant +dl-suffix+ #+darwin ".dylib" #+cygwin ".dll" #-(or darwin cygwin) ".so")
+
+(defun esubseq (s &optional (b 0) (e (length s)) &aux (s (string s)));avoid mdl/memmove call in subseq
+ (make-vector 'character (- e b) nil nil s b nil nil))
+
+(defun name-lib (n)
+ (when (>= (string-match (load-time-value (compile-regexp "\([^/]*\)$")) n) 0)
+ (setq n (esubseq n (match-beginning 1) (match-end 1))))
+ (when (>= (string-match (load-time-value (compile-regexp "(\.(so|dylib|dll))$")) n) 0)
+ (setq n (esubseq n 0 (match-beginning 1))))
+ #+darwin(when (>= (string-match (load-time-value (compile-regexp "^libsystem")) n) 0)
+ (setq n "libSystem"))
+ n)
+
+(defun lib-name (p &aux (p (name-lib p)))
+ (if (member p '("" "libc" "libm") :test #'string=)
+ "" ; FIXME
+ (string-concatenate p +dl-suffix+)))
+
+(defun find-external-symbol (str p)
+ (multiple-value-bind (sym key) (find-symbol str p)
+ (when (eq key :external)
+ sym)))
+
+(defun fdlsym (str n pk &aux r sym)
+ (declare (dynamic-extent r))
+ (let* ((n (name-lib n))
+ (psym (find-symbol n pk)))
+ (mapc (lambda (x &aux (s (find-external-symbol str x)))
+ (when s
+ (when (if sym (<= (symbol-value s) (symbol-value sym)) t)
+ (setq sym s))))
+ (if psym
+ (push psym r)
+ (when (zerop (length n))
+ *lib-package-syms*)))
+ sym))
+
+(defun dladdr-mod (p n &aux (p (name-lib p))(n (name-lib n)))
+ (cond ((cdr (assoc p *dladdr-mods* :test 'string=)))
+ ((unless (string= p n) (plusp (length n)))
+ (cdar (push (cons p n) *dladdr-mods*)))
+ (p)))
+
+(defun reg-psym (psym)
+ (car (or (member psym *lib-package-syms*)
+ (push psym *lib-package-syms*))))
+
+(defun mdlsym (str &optional (n "")
+ &aux (n (lib-name n))
+ (pk (load-time-value (or (find-package "LIB") (make-package "LIB")))))
+ (or
+ (fdlsym str n pk);FIXME repeated dlsym unreliable on non-Linux
+ (let* ((k (dlopen n))
+ (ad (dlsym k str))
+ (p (or (dladdr ad t) ""));FIXME work around dladdr here, not posix
+ (p (dladdr-mod p n))
+ (psym (reg-psym (intern p pk)))
+ (npk (or (find-package psym) (make-package psym :use '(:cl))))
+ (sym (and (shadow str npk) (intern str npk))))
+ (export (list psym) pk)
+ (export sym npk)
+ (set psym k)(set sym ad)
+ sym)))
(defun mdl (n p vad)
- (let* ((sym (mdlsym n (lib-name p)))
+ (let* ((sym (mdlsym n p))
(ad (symbol-value sym))
(adp (aref %init vad)))
(dladdr-set adp ad)
(dllist-push %memory sym adp)))
-
-(defun mdlsym (str &optional (n "" np))
- (let* ((pk (or (find-package "LIB") (make-package "LIB")))
- (k (if np (dlopen n) 0))
- (ad (dlsym k str))
- (p (or (dladdr ad t) ""));FIXME work around dladdr here, not posix
- (psym (intern p pk))
- (npk (or (find-package psym) (make-package psym :use '(:cl))))
- (sym (and (shadow str npk) (intern str npk))))
- (export (list psym) pk)
- (export sym npk)
- (set psym k)(set sym ad)
- sym))
-
static void *
malloc_internal(size_t size) {
- if (!gcl_alloc_initialized) {
+ if (!msbrk_initialized()) {
static bool recursive_malloc;
if (recursive_malloc)
error("Bad malloc");
recursive_malloc=1;
gcl_init_alloc(&size);
recursive_malloc=0;
- } else
- /*FIXME idempotent but required gcl_init_alloc functions in saved images*/
-#ifdef INITIALIZE_BRK
- INITIALIZE_BRK;
-#endif
-
+ }
CHECK_INTERRUPT;
DEFUN("DLSYM",object,fSdlsym,SI,2,2,NONE,OI,OO,OO,OO,(fixnum h,object name),"") {
- void *ad;
+ void *ad=0;
dlerror();
name=coerce_to_string(name);
massert(snprintf(FN1,sizeof(FN1),"%-.*s",VLEN(name),name->st.st_self)>0);
-#ifndef __CYGWIN__
+
ad=dlsym(h ? (void *)h : RTLD_DEFAULT,FN1);
- ad=ad ? ad : dlsym(RTLD_DEFAULT,FN1);
- ad=is_text_addr(ad) ? dlsym(RTLD_NEXT,FN1) : ad;
-#else
- ad=0;
- if (h) ad=dlsym((void *)h,FN1);
- {
- static void *n,*u,*c;
- n=n ? n : dlopen("ntdll.dll",RTLD_LAZY|RTLD_GLOBAL);
- u=u ? u : dlopen("ucrtbase.dll",RTLD_LAZY|RTLD_GLOBAL);
- c=c ? c : dlopen("cygwin1.dll",RTLD_LAZY|RTLD_GLOBAL);
- ad=ad ? ad : dlsym(n,FN1);
- ad=ad ? ad : dlsym(u,FN1);
- ad=ad ? ad : dlsym(c,FN1);
- ad=ad ? ad : dlsym(RTLD_DEFAULT,FN1);
- }
-#endif
+
+ ad=ad && is_text_addr(ad) ? dlsym(RTLD_NEXT,FN1) : ad;
+
if (!ad) {
char *er=dlerror();
FEerror("dlsym lookup failure on ~s: ~s",2,name,make_simple_string(er ? er : ""));
dlerror();
name=coerce_to_string(name);
- if (!strncmp("libc.so",name->st.st_self,VLEN(name)) || !strncmp("libm.so",name->st.st_self,VLEN(name)))
- v=dlopen(0,RTLD_LAZY|RTLD_GLOBAL);
- else {
- massert(snprintf(FN1,sizeof(FN1),"%-.*s",VLEN(name),name->st.st_self)>0);
- v=dlopen(FN1,RTLD_LAZY|RTLD_GLOBAL);
- }
+ massert(snprintf(FN1,sizeof(FN1),"%-.*s",VLEN(name),name->st.st_self)>=0);
+ v=dlopen(strlen(FN1) ? FN1 : 0,RTLD_LAZY|RTLD_GLOBAL);
if ((err=dlerror()))
FEerror("dlopen failure on ~s: ~s",2,name,make_simple_string(err));
static unsigned long gprof_on;
/*all but this stub to be written in the future provided*/
-#if defined(__APPLE__) && defined(__aarch64__)
+#if defined(__APPLE__)
void
_mcleanup(void) {
return;
static void *stack_map_base=(void *)-1;
void *shared_lib_start=(void *)-1;
+#if defined(__APPLE__)
+unsigned long heap_vmsize=INITIAL_HEAP_VMSIZE;
+#endif
+
static int
set_real_maxpage(void *beg) {
mp=ufmin(mp,get_phys_pages1(0,0));
-#if defined(__APPLE__) && defined(__aarch64__)
- {
- extern unsigned long heap_vmsize;
- mp=ufmin(mp,heap_vmsize>>PAGEWIDTH);
- }
+#if defined(__APPLE__)
+ mp=ufmin(mp,heap_vmsize>>PAGEWIDTH);
#endif
sz=ufmin(mem_bound,log_maxpage_bound);
}
-#if defined(__APPLE__) && defined(__aarch64__)
+#if defined(__APPLE__)
#include "disable_mac_aslr.h"
#endif
bds_top = bds_org-1;
frs_top = frs_org-1;
-#if defined(__APPLE__) && defined(__aarch64__)
+#if defined(__APPLE__)
disable_aslr(argc, argv, envp);
#endif
static void *m;
static ufixnum sz,mps;
+int
+msbrk_initialized(void) {
+ return m!=NULL;
+}
+
int
msbrk_end(void) {
but not so large that the Mac linker ignores the segment designation
and creates a __huge section under __DATA for this and other
variables. We enlarge this on unexec.*/
-unsigned long heap_vmsize=INITIAL_HEAP_VMSIZE;
#define mstr(a) #a
#define Mstr(a) mstr(a)
asm (".zerofill __HEAP,__heap,__end," Mstr(INITIAL_HEAP_VMSIZE) "\n\t.globl __end");
* Beware that the optimization-preparation code in here knows about some
* of the structure of the compiled regexp.
*/
+
+static char *regend; /* Non null terminated string end */
+#define GET_UCHAR(a_) ({char *_a=(a_);_a<regend ? *(unsigned char *)_a : 0;})
+
+
static regexp *
-regcomp(char *exp,ufixnum *sz)
+regcomp(char *exp,ufixnum *sz,ufixnum length)
{
register regexp *r;
register char *scan;
/* First pass: determine size, legality. */
regparse = exp;
+ regend=exp+length;
regnpar = 1;
regsize = 0L;
regcode = ®dummy;
/* Second pass: emit code. */
regparse = exp;
+ regend=exp+length;
regnpar = 1;
regcode = r->program;
regc(MAGIC);
if (!(flags&HASWIDTH))
*flagp &= ~HASWIDTH;
*flagp |= flags&SPSTART;
- while (*regparse == '|') {
+ while (GET_UCHAR(regparse) == '|') {
regparse++;
br = regbranch(&flags);
if (br == NULL)
regoptail(br, ender);
/* Check for proper termination. */
- if (paren && *regparse++ != ')') {
+ if (paren && GET_UCHAR(regparse++) != ')') {
FAIL("unmatched ()");
- } else if (!paren && *regparse != '\0') {
- if (*regparse == ')') {
+ } else if (!paren && GET_UCHAR(regparse) != '\0') {
+ if (GET_UCHAR(regparse) == ')') {
FAIL("unmatched ()");
} else
FAIL("junk on end"); /* "Can't happen". */
ret = regnode(BRANCH);
chain = NULL;
- while (*regparse != '\0' && *regparse != '|' && *regparse != ')') {
+ while (GET_UCHAR(regparse) != '\0' && GET_UCHAR(regparse) != '|' && GET_UCHAR(regparse) != ')') {
latest = regpiece(&flags);
if (latest == NULL)
return(NULL);
if (ret == NULL)
return(NULL);
- op = *regparse;
+ op = GET_UCHAR(regparse);
if (!ISMULT(op)) {
*flagp = flags;
return(ret);
regoptail(ret, next);
}
regparse++;
- if (ISMULT(*regparse))
+ if (ISMULT(GET_UCHAR(regparse)))
FAIL("nested *?+");
return(ret);
*flagp = WORST; /* Tentatively. */
- switch (*regparse++) {
+ switch (GET_UCHAR(regparse++)) {
case '^':
ret = regnode(BOL);
break;
register int classend;
ret = regnode(ANYOF);
- if (*regparse == '^') { /* Complement of range. */
+ if (GET_UCHAR(regparse) == '^') { /* Complement of range. */
matches = 0;
regparse++;}
- if (*regparse == ']' || *regparse == '-')
- REGC(*regparse++);
- while (*regparse != '\0' && *regparse != ']') {
- if (*regparse == '-') {
+ if (GET_UCHAR(regparse) == ']' || GET_UCHAR(regparse) == '-')
+ REGC(GET_UCHAR(regparse++));
+ while (GET_UCHAR(regparse) != '\0' && GET_UCHAR(regparse) != ']') {
+ if (GET_UCHAR(regparse) == '-') {
regparse++;
- if (*regparse == ']' || *regparse == '\0')
+ if (GET_UCHAR(regparse) == ']' || GET_UCHAR(regparse) == '\0')
REGC('-');
else {
- clss = UCHARAT(regparse-2)+1;
- classend = UCHARAT(regparse);
+ clss = GET_UCHAR(regparse-2)+1;
+ classend = GET_UCHAR(regparse);
if (clss > classend+1)
FAIL("invalid [] range");
for (; clss <= classend; clss++)
regparse++;
}
} else
- REGC(*regparse++);
+ REGC(GET_UCHAR(regparse++));
}
REGC('\0');
- if (*regparse != ']')
+ if (GET_UCHAR(regparse) != ']')
FAIL("unmatched []");
regparse++;
*flagp |= HASWIDTH|SIMPLE;
/* NOTREACHED */
break;
case '\\':
- if (*regparse == '\0')
+ if (GET_UCHAR(regparse) == '\0')
FAIL("trailing \\");
ret = regnode(EXACTLY);
- regc(*regparse++);
+ regc(GET_UCHAR(regparse++));
regc('\0');
*flagp |= HASWIDTH|SIMPLE;
break;
register char ender;
regparse--;
- len = strcspn(regparse, META);
+ len=({ufixnum _l=0;char _c,*_s=regparse;/*strcspn*/
+ for (;(_c=GET_UCHAR(_s++)) && !strchr(META,_c);_l++);
+ _l;});
if (len <= 0)
FAIL("internal disaster");
- ender = *(regparse+len);
+ ender = GET_UCHAR(regparse+len);
if (len > 1 && ISMULT(ender))
len--; /* Back off clear of ?+* operand. */
*flagp |= HASWIDTH;
*flagp |= SIMPLE;
ret = regnode(EXACTLY);
while (len > 0) {
- regc(*regparse++);
+ regc(GET_UCHAR(regparse++));
len--;
}
regc('\0');
regexec(register regexp *prog, register char *string, char *start, int length)
{
register char *s;
- char saved,*savedp=NULL;
int value;
/* Be paranoid... */
return(0);
}
- /* null terminate string */
- if (length)
- { savedp = &string[length];
- saved = *savedp;
- if (saved) *savedp=0;
- }
- else saved=0;
+ regend=string+length;
+
#define RETURN_VAL(i) do {value=i; goto DO_RETURN;}while(0)
/* Mark beginning of line for ^ . */
int amt;
- unsigned char *s = (unsigned char *)string+ advance -1;
+ char *s = string+ advance -1;
min_initial_branch_length(prog, buf,advance);
switch(advance) {
case 1:
while (1)
- { if (buf[*s]==0)
- { if (*s == 0) RETURN_VAL(0);
+ { if (buf[GET_UCHAR(s)]==0)
+ { if (GET_UCHAR(s) == 0) RETURN_VAL(0);
else
if (regtry(prog,(char *)s-(1-1))) RETURN_VAL(1);}
s++; }
case 2:
while (length > 0)
{
- amt = (buf[s[0]]);
+ amt = (buf[GET_UCHAR(s)]);
if (amt == 0)
{
- amt = buf[s[-1]]-1;
+ amt = buf[GET_UCHAR(s-1)]-1;
if (amt <=0) {
if (regtry(prog,(char *)s-(advance-1)))
RETURN_VAL(1);
RETURN_VAL(0);
case 3:
while (length > 0)
- { amt = (buf[s[0]]);
+ { amt = (buf[GET_UCHAR(s)]);
if (amt == 0)
- {amt = buf[s[-1]]-1;
+ {amt = buf[GET_UCHAR(s-1)]-1;
if (amt <=0)
- {amt = buf[s[-2]]-2;
+ {amt = buf[GET_UCHAR(s-2)]-2;
if (amt <=0)
{if (regtry(prog,(char *)s-(advance-1))) RETURN_VAL(1);
else amt =1;}}}
s += amt; length -= amt;}
case 4:
while (length > 0)
- { amt = (buf[s[0]]);
+ { amt = (buf[GET_UCHAR(s)]);
if (amt == 0)
- {amt = buf[s[-1]]-1;
+ {amt = buf[GET_UCHAR(s-1)]-1;
if (amt <=0)
- {amt = buf[s[-2]]-2;
+ {amt = buf[GET_UCHAR(s-2)]-2;
if (amt <=0)
- {amt = buf[s[-3]]-3;
+ {amt = buf[GET_UCHAR(s-3)]-3;
if (amt <=0)
{if (regtry(prog,(char *)s-(advance-1))) RETURN_VAL(1);
else amt =1;}}}}
default:
while (length > 0)
- { amt = (buf[s[0]]);
+ { amt = (buf[GET_UCHAR(s)]);
if (amt == 0)
- {amt = buf[s[-1]]-1;
+ {amt = buf[GET_UCHAR(s-1)]-1;
if (amt <=0)
- {amt = buf[s[-2]]-2;
+ {amt = buf[GET_UCHAR(s-2)]-2;
if (amt <=0)
- {amt = buf[s[-3]]-3;
+ {amt = buf[GET_UCHAR(s-3)]-3;
if (amt <=0)
- {amt = buf[s[-4]]-4;
+ {amt = buf[GET_UCHAR(s-4)]-4;
if (amt <=0)
{if (regtry(prog,(char *)s-(advance-1))) RETURN_VAL(1);
else amt =1;}}}}}
/* We know what char it must start with. */
{ if (case_fold_search)
{char ch = tolower(prog->regstart);
- while (*s)
- { if (tolower(*s)==ch)
+ while (GET_UCHAR(s))
+ { if (tolower((GET_UCHAR(s)))==ch)
{if (regtry(prog, s))
RETURN_VAL(1);}
s++;}}
else
- while ((s = strchr(s, prog->regstart)) != NULL) {
+ while ((s = memchr(s, prog->regstart,regend-s)) != NULL) {
if (regtry(prog, s))
RETURN_VAL(1);
s++;
do {
if (regtry(prog, s))
RETURN_VAL(1);
- } while (*s++ != '\0');
+ } while (GET_UCHAR(s) && s++);
/* Failure. */
RETURN_VAL(0);
DO_RETURN:
- if(saved) *savedp=saved;
return value;
}
return(0);
break;
case EOL:
- if (*reginput != '\0')
+ if (GET_UCHAR(reginput) != '\0')
return(0);
break;
case ANY:
- if (*reginput == '\0')
+ if (GET_UCHAR(reginput) == '\0')
return(0);
reginput++;
break;
opnd = OPERAND(scan);
if (case_fold_search)
while (*opnd )
- { if (tolower(*opnd) != tolower(*ch))
+ { if (tolower(*opnd) != tolower(GET_UCHAR(ch)))
return 0;
else { ch++; opnd++;}}
else
while (*opnd )
- { if (*opnd != *ch)
+ { if (*opnd != GET_UCHAR(ch))
return 0;
else { ch++; opnd++;}}
/* a match */
}
break;
case ANYOF:
- if (*reginput == '\0' ||
- OPERAND(scan)[*(unsigned char *)reginput] == 0)
+ if (GET_UCHAR(reginput) == '\0' ||
+ OPERAND(scan)[GET_UCHAR(reginput)] == 0)
return(0);
reginput++;
break;
case ANYBUT:
- if (*reginput == '\0' ||
- OPERAND(scan)[*(unsigned char *)reginput] != 0)
+ if (GET_UCHAR(reginput) == '\0' ||
+ OPERAND(scan)[GET_UCHAR(reginput)] != 0)
return(0);
reginput++;
break;
while (no >= min) {
/* If it could work, try it. */
if (nextch == '\0' ||
- *reginput == nextch
+ GET_UCHAR(reginput) == nextch
|| (case_fold_search &&
- tolower(*reginput) == nextch))
+ tolower(GET_UCHAR(reginput)) == nextch))
if (regmatch(next))
return(1);
/* Couldn't or didn't -- back up. */
opnd = OPERAND(p);
switch (OP(p)) {
case ANY:
- count = strlen(scan);
+ count = regend-scan/* strlen(scan) */;
scan += count;
break;
case EXACTLY:
{ char ch = *opnd;
if (case_fold_search)
{ ch = tolower(*opnd);
- while (ch == tolower(*scan))
+ while (ch == tolower(GET_UCHAR(scan)))
{
count++;
scan++;}}
else
- while (ch == *scan) {
+ while (ch == GET_UCHAR(scan)) {
count++;
scan++;
}}
break;
case ANYOF:
- while (*scan != '\0' &&
- opnd[*(unsigned char *)scan] != 0)
+ while (GET_UCHAR(scan) != '\0' &&
+ opnd[GET_UCHAR(scan)] != 0)
{
count++;
scan++;
}
break;
case ANYBUT:
- while (*scan != '\0' &&
- opnd[*(unsigned char *)scan] == 0)
+ while (GET_UCHAR(scan) != '\0' &&
+ opnd[GET_UCHAR(scan)] == 0)
{
count++;
scan++;
DEFUN("COMPILE-REGEXP",object,fScompile_regexp,SI,1,1,NONE,OO,OO,OO,OO,(object p),
"Provide handle to export pre-compiled regexp's to string-match") {
- char *tmp;
object res;
void *v;
ufixnum sz=0;
p=coerce_to_string(p);
- if (!(tmp=alloca(VLEN(p)+1)))
- FEerror("out of C stack",0);
- memcpy(tmp,p->st.st_self,VLEN(p));
- tmp[VLEN(p)]=0;
- if (!(v=(void *)regcomp(tmp,&sz)))
+ if (!(v=(void *)regcomp(p->st.st_self,&sz,VLEN(p))))
FEerror("regcomp failure",0);
res=alloc_object(t_vector);
int len,start,end;
va_list ap;
object v=sSAmatch_dataA->s.s_dbind,l=Cnil,f=OBJNULL;
- char **pp,*str,save_c=0;
+ char **pp,*str;
if (!stringp(pattern) && type_of(pattern)!=t_symbol &&
(type_of(pattern)!=t_vector || pattern->v.v_elttype!=aet_uchar))
}
str=string->st.st_self;
- if (NULL_OR_ON_C_STACK(str+end) || str+end==(void *)compiled_regexp) {
-
- if (!(str=alloca(VLEN(string)+1)))
- FEerror("Cannot allocate memory on C stack",0);
- memcpy(str,string->st.st_self,VLEN(string));
-
- } else
- save_c=str[end];
- str[end]=0;
-
ans = regexec(compiled_regexp,str+start,str,end-start);
- str[end] = save_c;
-
if (!ans ) {
END_NO_INTERRUPT;
RETURN1((object)-1);
d=d/(c+I*d);
}
-#if defined(__APPLE__) && defined(__aarch64__)/*FIXME non-lazy pointer support in sfaslmacho.c*/
+#if defined(__APPLE__)/*FIXME non-lazy pointer support in sfaslmacho.c*/
extern void __chkstk_darwin(void);
__chkstk_darwin();
#endif
STATIC_RELOC_VARS
#endif
-static int
+static inline int
ovchks(ul v,ul m) {
m|=m>>1;
}
-static int
+static inline int
ovchku(ul v,ul m) {
return !(v&=m);
}
-static int
+static inline int
store_val(ul *w,ul m,ul v) {
*w=(v&m)|(*w&~m);
}
-static int
+static inline int
store_valu(ul *w,ul m,ul v) {
massert(ovchku(v,~m));
}
-static int
+static inline int
store_vals(ul *w,ul m,ul v) {
massert(ovchks(v,~m));
}
-#ifdef W_X
-static int
+static inline int
add_vals(ul *w,ul m,ul v) {
- return store_vals(w,m,v+(*w&m));
+ return store_vals(w,m,v+(*w&m)-((*w&((m+1)>>1))<<1));
}
-static int
+static inline int
add_valu(ul *w,ul m,ul v) {
return store_valu(w,m,v+(*w&m));
}
-#endif
#ifndef _LP64
/*redirect trampolines gcc-4.0 gives no reloc for stub sections on x86 only*/
if ((c=strstr(src,e))) {
memcpy(buf,src,(c-src));
buf[c-src]=0;
- printf("dup %s -> %s\n",src,buf);
return buf;
}
if (!strcmp(src,"_my_free")||!strcmp(src,"_my_calloc")||!strcmp(src,"_my_malloc")||!strcmp(src,"_my_realloc")) {
strcpy(buf,src+3);
- printf("dup %s -> %s\n",src,buf);
return buf;
}
return NULL;
typedef struct {
uint32_t magic; /* 0xfade0b01 (CSMAGIC_BLOBWRAPPER) */
uint32_t length; /* Total length of header + CMS data */
+ uint8_t zero[18040-30];
} CS_BlobWrapper;
#include <CommonCrypto/CommonDigest.h>
CS_Requirements rq;
CS_BlobWrapper cms;
const char *id="GCL";
- const long nss=2,ss=32,id_len=RNDUP(strlen(id)+1,8);
+ const long nss=2,ss=32,id_len=strlen(id)+1;
long cd_len,len,np,i;
uint8_t hash[32],data[PAGESIZE];
void *v;
lseek(outfd,0,SEEK_END);
len=lseek(outfd,0,SEEK_CUR);
- if (len%16) {
- unsigned long x=0;
- mwrite(&x,sizeof(x));
- len=lseek(outfd,0,SEEK_CUR);
- }
ldc.dataoff=len;
np=RNDUP(len,PAGESIZE)>>PAGEWIDTH;
curr_header_offset+=ldc.cmdsize;
le_seg->filesize+=ldc.datasize;
- le_seg->vmsize+=RNDUP(ldc.datasize,PAGESIZE);
+ le_seg->vmsize+=RNDUP(ldc.datasize,1<<14);
mpwrite(le_seg,sizeof(*le_seg),le_ho);
uassert(curr_header_offset<=text_seg_lowest_offset);
mpwrite(&mh,sizeof(mh),0);
sb.magic=htonl(0xfade0cc0);
- sb.length=htonl(sizeof(sb)+sizeof(bi)+cd_len+sizeof(rq)+sizeof(cms));
+ sb.length=htonl(ldc.datasize-sizeof(cms.zero)-2);
sb.count=htonl(sizeof(bi)/sizeof(*bi));
mwrite(&sb,sizeof(sb));
mwrite(v,id_len);
rq.magic=htonl(0xfade0c01);
- rq.length=htonl(12);
+ rq.length=htonl(sizeof(rq));
rq.count=htonl(0);
CC_SHA256(&rq,sizeof(rq),hash);
mwrite(hash,sizeof(hash));
mwrite(hash,sizeof(hash));
for (i=0;i<np;i++) {
- uassert(memset(data,0,sizeof(data)));
- mpred(data,i==np-1 ? ntohl(cd.codeLimit)-(i<<PAGEWIDTH) : sizeof(data),i<<PAGEWIDTH);
- CC_SHA256(data,sizeof(data),hash);
+ unsigned long n=i==np-1 ? ntohl(cd.codeLimit)-(i<<PAGEWIDTH) : sizeof(data);
+ mpred(data,n,i<<PAGEWIDTH);
+ CC_SHA256(data,n,hash);
mwrite(hash,sizeof(hash));
}
long linkedit_delta=0,linkedit_vmdelta=0,linkedit_vmsize=0,text_vmaddr=0;
struct segment_command *le_seg=NULL,*tx_seg=NULL;
unsigned long le_ho=0;
+ extern unsigned long heap_vmsize;
+ extern int in_pre_gcl;/*support libboot.so*/
+ extern char *data_start;
#if VERBOSE
printf ("--- Load Commands written to Output File ---\n");
}
}
uassert(le_seg&&tx_seg);
+ {
+ heap_vmsize= \
+ (in_pre_gcl ? SAVED_PRE_IMAGE_SPAN : SAVED_IMAGE_SPAN) - \
+ (long)((long)data_start-text_vmaddr) - \
+ linkedit_vmsize;
+ }
for (i = 0; i < nlc; i++)
switch (lca[i]->cmd) {
struct section *sectp = (struct section *) (scp + 1);
unsigned long header_offset=curr_header_offset + sizeof (struct segment_command);
extern int in_pre_gcl;/*support libboot.so*/
- unsigned long heap_vmsize= \
- (in_pre_gcl ? SAVED_PRE_IMAGE_SPAN : SAVED_IMAGE_SPAN) - \
- (long)((long)data_start-text_vmaddr) - \
- linkedit_vmsize;
if (core_end-data_start>heap_vmsize)
unexec_error ("data exceeds __HEAP vmsize");